20819
2176
다음과 같은 초 단위 시간 목록이 있습니다.
L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
두 번째 경계에서 시작하여 길이가 2 초인 각 창에 대해 2 초 창에 속하는 모든 시간의 목록을 출력하고 싶습니다. 따라서 위의 예에서는 다음과 같습니다.
[0.10218048, 1.20851996, 1.46800021, 1.73429061]
[1.20851996, 1.46800021, 1.73429061, 2.71525848]
[2.71525848, 3.14781922, 3.63637958]
[3.14781922, 3.63637958]
[5.11147358, 5.97497864]
[5.11147358, 5.97497864, 6.35469013, 6.80623747, 6.99571917]
[6.35469013, 6.80623747, 6.99571917, 7.65215123, 7.86108352]
[7.65215123, 7.86108352, 8.52988247, 8.83068894]
[8.52988247, 8.83068894]
[10.07690977]
[10.07690977, 11.5386728]
[11.5386728, 12.01214112, 12.13307653]
[12.01214112, 12.13307653]
일반적으로 창 길이는 2와 다를 수 있습니다.
어떻게 할 수 있습니까? 
나는 당신이 "두 번째 경계에서 시작하여 2 초 길이의 각 창에 대해"를 기준으로 증가하고 겹치지 않는 것을 의미한다고 생각합니다. 2 초 간격의 경우 동일하지만 길이를 변경하고 싶기 때문에 1 초 겹침은 0-3, 2-5, 4-7이되지만 증분은 0-3, 1-4, 2-를 의미합니다. 5. 그러나 만일을 대비하여 둘 다에 대한 해결책을 찾는 것은 흥미로 웠습니다.
L이 정렬되고 모든 요소가 양수이고 두 번째 간격이 모두 정수로 시작한다고 가정하면 다음 방법을 사용할 수 있습니다.
수입 수학
컬렉션에서 가져 오기 defaultdict
L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
my_ranges = defaultdict (목록)
간격 _ 폭 = 2
L에서 x의 경우 :
upper_bound = math.ceil (x)
lower_bound = upper_bound-간격 _ 폭
lower_bound = max (0, lower_bound)
범위 (하한값, 상한값)의 y에 대해 :
my_ranges [y] .append (x)
in sorted (my_ranges) :
print (내 _ 범위 [a])
빈 범위가 있는지보고 싶은지 모르겠습니다. 그러나 defaultdict는 원하는 경우 빈 범위도 인쇄합니다. "for a in sorted"대신 다음 줄을 사용하십시오.
범위 내 (min (my_ranges), max (my_ranges) + 1) :
0-3, 2-5, 4-7 범위를 원하면 다음과 같이 작동합니다.
수입 수학
컬렉션에서 가져 오기 defaultdict
L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
간격 _ 폭 = 2
my_ranges_2 = defaultdict (목록)
L에서 x의 경우 :
확실히 _in = (x // (interval_width-1)) * (interval_width-1) # x 아래의 interval_width의 가장 낮은 배수는 항상
#print ( "추가", x, "대상", 확실히 _in)
my_ranges_2 [definitely_in] .append (x)
if x  = 0 : # 예를 들어 x가 2.3이고 0,3 2,5 등이 있다면 ...이 중복 된 경우를 잡아야합니다. 나는 창 길이가 정수라고 가정하고, 그렇지 않다면 숫자가 하나 이상의 배열에 들어갈 수 있기 때문에 우리는 할 일이 훨씬 더 많습니다. 아마도 우리는 (interval_width-1) 씩 증가하는 while 루프를 가질 수 있습니다.
#print ( "++ 추가", x, "끝", 확실히 _in-간격 _ 너비 + 1)
my_ranges_2 [definitely_in-interval_width + 1] .append (x)
in sorted (my_ranges_2) :
print (a, my_ranges_2 [a])
# print (my_ranges_2 [a])
내가 잊은 몇 가지 세부 사항이 있다고 생각하지만 필요에 따라 interval_width를 조정하여 내 코드가 원하는 작업을 수행하는지 확인하고 정확히 필요한 것을 알려주십시오.
|
제가 제안 할 수있는 가능한 솔루션은 어떤 의미에서 "효율적"입니다. 입력 데이터를 한 번만 반복하고 종속성이 없습니다. 물론 비용은 순수한 파이썬으로 작성되고 (더 최적화 된 코드가있을 수 있음) 반복을 방지하기 위해 더 많은 추적 변수를 도입한다는 것입니다 (따라서 비단뱀 적입니다).
def slide_window (데이터, 기간, 시작 = 0, 겹침 = 1) :
결과 = []
data_idx = 0
result_idx = 0
상한 = 시작 + 기간
낮음 = 시작
next_lower = 위쪽-겹침
# 빈 내부 목록을 삽입 지점까지 채우고 삽입하는 내부 도우미
def pad_and_append (at) :
len (result) <= at :
result.append ([])
result [at] .append (data [data_idx])
# 입력 데이터를 반복
동안 data_idx  a 인 경우 :
x  = l [0]) & (L  = i) & (L